﻿<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // 在应用程序启动时运行的代码
        AuthRole.Init();
    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  在应用程序关闭时运行的代码

    }

    void Application_Error(object sender, EventArgs e)
    {
        if (UIMethod.GetAppSettings("ErrorCatch") == "0") { return; }

        string ext = new System.IO.FileInfo(this.Context.Request.Path).Extension.ToLower();
        if (ext != ".aspx") { return; }
        
        // 在出现未处理的错误时运行的代码
        Exception ex = this.Context.Error.InnerException;
        if (ex == null) { return; }
        HttpRequest hr = this.Context.Request;
        string errtmp =
@"时间：{0}
页面：{1}
参数：{2}
方式：{3}
程序路径：{4}
物理地址：{5}
请求客户端IP：{6}
请求前地址：{7}
异常简介：{8}
【异常详细】
{9}
";
        string errinfo = string.Format(errtmp,
            DateTime.Now.ToString(),//{0}
            hr.Path,//{1}
            hr.Url.Query,//{2}
            hr.HttpMethod,//{3}
            hr.ApplicationPath,//{4}
            hr.PhysicalPath,//{5}
            hr.UserHostAddress,//{6}
            hr.RawUrl,//{7}
            ex.Message,//{8}
            UIMethod.ExceptionLines(ex.StackTrace) //{9}
            );


        
            //保存目录(如果数据库打不开就写在物理文件)
            string savedir = hr.MapPath("~/Error/");
            if (!System.IO.Directory.Exists(savedir))
            {
                System.IO.Directory.CreateDirectory(savedir);
            }
            //记录
            string filePath = savedir + Guid.NewGuid().ToString() + ".txt";
            System.IO.StreamWriter sw = System.IO.File.CreateText(filePath);
            sw.Write("【简介】" + ex.Message + "\r\n【异常详细】\r\n" + errinfo);
            sw.Close();        
    }

    void Session_Start(object sender, EventArgs e) 
    {
        // 在新会话启动时运行的代码
        DataEntity.tab_Statistics t = new DataEntity.tab_Statistics();
        t.sta_IPAddress = Request.UserHostAddress;
        t.sta_FromURL = Request.RawUrl;
        t.sta_ToURL = Request.Path;
        t.Insert();
    }

    void Session_End(object sender, EventArgs e) 
    {
        // 在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时，才会引发 Session_End 事件。如果会话模式设置为 StateServer 
        // 或 SQLServer，则不会引发该事件。

    }

    protected void Application_AuthorizeRequest(object sender, System.EventArgs e)
    {
        HttpApplication App = (HttpApplication)sender;
        HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
        HttpCookie authcook = Ctx.Request.Cookies["AuthCookie"];

        if (authcook != null && authcook.Value != string.Empty)
        {
            try
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authcook.Value); //取得身份验证票
                string[] Roles = ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组 

                Ctx.User = new System.Security.Principal.GenericPrincipal(Ctx.User.Identity, Roles); //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息

                Ctx.Response.Cookies["AuthCookie"].Value = authcook.Value;
                Ctx.Response.Cookies["AuthCookie"].Expires = DateTime.Now.AddMinutes(20);
            }
            catch { }
        }
    }
       
</script>
